home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -seriously_amiga- / programming / other / cyberxxxsrc / misc / mathutils.mod < prev    next >
Text File  |  1999-02-08  |  3KB  |  102 lines

  1. MODULE  MathUtils;
  2.  
  3. (* $StackChk- $OvflChk- $RangeChk- $CaseChk- $ReturnChk- $NilChk- $TypeChk- $OddChk- $ClearVars- *)
  4.  
  5. IMPORT  e:=Exec,
  6.         mf:=MathFFP,
  7.         mt:=MathTrans,
  8.         sl:=StringLib,
  9.         t:=Timer,
  10.         y:=SYSTEM;
  11.  
  12. (* $JOIN Math64.o *)
  13.  
  14. PROCEDURE Add64 * {"_add64"} (VAR dst{8},src{9}: t.EClockVal); (* dst=dst+src *)
  15.  
  16. PROCEDURE Sub64 * {"_sub64"} (VAR dst{8},src{9}: t.EClockVal); (* dst=dst-src *)
  17.  
  18. PROCEDURE Cmp64 * {"_cmp64"} (VAR dst{8},src{9}: t.EClockVal): LONGINT; (* -1   dst>src
  19.                                                                             0   dst=src
  20.                                                                            +1   dst<src *)
  21.  
  22. (* /// --------------------------- "PROCEDURE max()" --------------------------- *)
  23. PROCEDURE max * (a: LONGINT;
  24.                  b: LONGINT): LONGINT;
  25. BEGIN
  26.   IF a>b THEN
  27.     RETURN a;
  28.   ELSE
  29.     RETURN b;
  30.   END;
  31. END max;
  32. (* \\\ ------------------------------------------------------------------------- *)
  33.  
  34. (* /// --------------------------- "PROCEDURE min()" --------------------------- *)
  35. PROCEDURE min * (a: LONGINT;
  36.                  b: LONGINT): LONGINT;
  37. BEGIN
  38.   IF a<b THEN
  39.     RETURN a;
  40.   ELSE
  41.     RETURN b;
  42.   END;
  43. END min;
  44. (* \\\ ------------------------------------------------------------------------- *)
  45.  
  46. (* /// -------------------------- "PROCEDURE floor()" -------------------------- *)
  47. PROCEDURE floor * (x: REAL): LONGINT;
  48. BEGIN
  49.   RETURN ENTIER(x+0.5);
  50. END floor;
  51. (* \\\ ------------------------------------------------------------------------- *)
  52.  
  53. (* /// ------------------------ "PROCEDURE real2int()" ------------------------- *)
  54. PROCEDURE real2int * (r: REAL;
  55.                       VAR entier: LONGINT;
  56.                       VAR fraction: LONGINT;
  57.                       fracLen: LONGINT);
  58.  
  59. VAR     x: LONGINT;
  60.         factor: LONGINT;
  61.         neg: BOOLEAN;
  62.  
  63. BEGIN
  64.   factor:=1;
  65.   FOR x:=1 TO fracLen DO factor:=factor*10; END;
  66.   neg:=(r<0);
  67.   r:=mf.Abs(r);
  68.   entier:=floor(r*factor) DIV factor;
  69.   fraction:=floor((r-entier)*factor);
  70.   IF neg THEN entier:=-entier; END;
  71. END real2int;
  72. (* \\\ ------------------------------------------------------------------------- *)
  73.  
  74. (* /// ------------------------ "PROCEDURE real2str()" ------------------------- *)
  75. PROCEDURE real2str * (f: REAL;
  76.                       VAR str: e.STRING;
  77.                       fracLen: LONGINT);
  78.  
  79. VAR     entier: LONGINT;
  80.         fraction: LONGINT;
  81.         c: LONGINT;
  82.         fmt: e.STRING;
  83.  
  84. BEGIN
  85.   IF f<0 THEN
  86.     c:=1;
  87.     str[0]:="-";
  88.     f:=mf.Abs(f);
  89.   ELSE
  90.     c:=0;
  91.   END;
  92.   f:=f+mt.Pow(fracLen,0.1)/2;
  93.   entier:=ENTIER(f);
  94.   fraction:=ENTIER(mt.Pow(fracLen,10)*(f-mf.Floor(f)));
  95.   sl.sprintf(fmt,"%%ld.%%0%ldld",fracLen);
  96.   sl.sprintfP(y.ADR(str[c]),fmt,entier,fraction);
  97. END real2str;
  98. (* \\\ ------------------------------------------------------------------------- *)
  99.  
  100. END MathUtils.
  101.  
  102.